<?php
/**
 * Here is your custom functions.
 */

use support\Redis;

/**
 * 设置 Redis 缓存
 * 
 * @param string $key 缓存键
 * @param mixed $data 缓存数据
 * @param int $ttl 过期时间（秒）
 * @return bool
 */
function cache_set(string $key, $data, int $ttl = 300): bool
{
    try {
        $cacheData = [
            'expire' => time() + $ttl,
            'data' => $data
        ];
        return Redis::setex($key, $ttl, json_encode($cacheData, JSON_UNESCAPED_UNICODE));
    } catch (\Throwable $e) {
        return false;
    }
}

/**
 * 获取 Redis 缓存
 * 
 * @param string $key 缓存键
 * @return mixed|null
 */
function cache_get(string $key)
{
    try {
        $cached = Redis::get($key);
        if ($cached === null) {
            return null;
        }
        
        $data = json_decode($cached, true);
        if (!is_array($data) || !isset($data['expire']) || time() >= (int)$data['expire']) {
            // 删除过期缓存
            Redis::del($key);
            return null;
        }
        
        return $data['data'] ?? null;
    } catch (\Throwable $e) {
        return null;
    }
}

/**
 * 删除 Redis 缓存
 * 
 * @param string $key 缓存键
 * @return bool
 */
function cache_del(string $key): bool
{
    try {
        return Redis::del($key) > 0;
    } catch (\Throwable $e) {
        return false;
    }
}

/**
 * 生成 GPS 缓存键
 * 
 * @param string $path 接口路径
 * @param array $form 请求参数
 * @return string
 */
function gps_cache_key(string $path, array $form): string
{
    // 构建参数签名
    $params = $form;
    ksort($params);
    $signature = md5($path . '|' . http_build_query($params));
    
    return 'gps:cache:' . $signature;
}

/**
 * 带缓存的 HTTP 请求包装器
 * 
 * @param callable $httpCall HTTP 请求回调函数
 * @param string $path 接口路径
 * @param array $form 请求参数
 * @param int $ttl 缓存时间（秒）
 * @return mixed
 */
function cached_http_request(callable $httpCall, string $path, array $form, int $ttl = 5)
{
    $key = gps_cache_key($path, $form);
    
    // 尝试从缓存获取
    $cached = cache_get($key);
    if ($cached !== null) {
        return $cached;
    }
    
    // 执行 HTTP 请求
    $result = $httpCall($path, $form);
    
    // 仅在成功时缓存
    if (is_array($result)) {
        if (!isset($result['ok']) || $result['ok'] !== false) {
            cache_set($key, $result, $ttl);
        }
    } else {
        cache_set($key, $result, $ttl);
    }
    
    return $result;
}
